/*
Copyright (C) 1994-1995 Apogee Software, Ltd.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
/**********************************************************************
   module: RT_BATTL.H

   author: James R. Dose
   phone:  (214)-271-1365 Ext #221
   date:   September 8, 1994

   Public header for RT_BATTL.C

   (c) Copyright 1994 Apogee Software.  All Rights Reserved.
**********************************************************************/

#ifndef __RT_BATTLE_public
#define __RT_BATTLE_public


#define BIT_MASK( bit_number )   ( 1 << ( bit_number ) )
#define MINUTES_TO_GAMECOUNT( minutes ) \
   ( ( minutes ) * 60 * VBLCOUNTER )

//
// Return codes
//

typedef enum
   {
   battle_no_event,
   battle_end_game,
   battle_end_round,
   battle_out_of_time
   } battle_status;

//
// Types of battle events
//

typedef enum
   {
   battle_refresh,
	battle_player_killed,
	battle_player_tagged,
	battle_kill_with_missile,
   battle_kill_with_bullet,
   battle_kill_with_missile_in_air,
   battle_kill_with_bullet_in_air,
   battle_kill_by_crushing,
   battle_get_collector_item,
   battle_caught_eluder,
	battle_shot_deluder,
   battle_captured_triad
   } battle_event;

//
// Battle modes
//

typedef enum
   {
   battle_StandAloneGame,
   battle_Normal,
   battle_ScoreMore,
   battle_Collector,
   battle_Scavenger,
   battle_Hunter,
   battle_Tag,
   battle_Eluder,
   battle_Deluder,
	battle_CaptureTheTriad,
   battle_NumBattleModes
   };

//
// Battle mode option : Gravity
//

//typedef enum
//   {
//   bo_low_gravity,
//   bo_normal_gravity,
//   bo_high_gravity
//   };

//
// Battle mode option : Speed
//

typedef enum
   {
   bo_normal_speed,
   bo_fast_speed
   };

//
// Battle mode option : Ammo
//

typedef enum
   {
   bo_one_shot,
   bo_normal_shots,
   bo_infinite_shots
   };

//
// Battle mode option : Hit points
//

#define bo_character_hitpoints 0
#define bo_default_hitpoints   250

//
// Battle mode option : Light levels
//

typedef enum
   {
   bo_light_dark,
   bo_light_normal,
   bo_light_bright,
   bo_light_fog,
   bo_light_periodic,
   bo_light_lightning
   };

//
// Battle mode option : Number of kills
//

typedef enum
   {
   bo_kills_random   = -2,
   bo_kills_blind    = -1,
   bo_kills_infinite = 0,
   bo_kills_default  = 21
   };

//
// Battle mode option : Environment danger damage
//

typedef enum
   {
   bo_danger_normal = -1,
   bo_danger_low    = 1,
   bo_danger_kill   = 30000
   };

//
// Battle mode option : Time limit
//
#define bo_time_infinite 0

//
// Battle mode configuration
//
typedef struct
	{
	unsigned Gravity;
	unsigned Speed;
	unsigned Ammo;
	unsigned HitPoints;
	unsigned SpawnDangers;
	unsigned SpawnHealth;
	unsigned SpawnWeapons;
   unsigned SpawnMines;
   unsigned RespawnItems;
   unsigned WeaponPersistence;
   unsigned RandomWeapons;
   unsigned FriendlyFire;
	unsigned LightLevel;
	int      Kills;
	int      DangerDamage;
	unsigned TimeLimit;
   unsigned RespawnTime;
   } battle_type;

#define bo_normal_respawn_time 30

extern boolean  BATTLEMODE;
extern short    WhoKilledWho[ MAXPLAYERS ][ MAXPLAYERS ];
extern short    BATTLE_Points[ MAXPLAYERS ];
extern short    BATTLE_PlayerOrder[ MAXPLAYERS ];
extern int      BATTLE_NumCollectorItems;
extern int      PointGoal;
extern int      DisplayPoints;
extern int      BATTLE_It;
extern boolean  BATTLE_ShowKillCount;
extern short    BATTLE_Team[ MAXPLAYERS ];
extern short    BATTLE_TeamLeader[ MAXPLAYERS ];
extern int      BATTLE_NumberOfTeams;
extern boolean  UpdateKills;

// Located in RT_MENU.C
extern battle_type    BATTLE_Options[ battle_NumBattleModes ];

void          BATTLE_Init( int battlemode, int numplayers );
void          BATTLE_GetSpecials( void );
void          BATTLE_SetOptions( battle_type *options );
void          BATTLE_GetOptions( battle_type *options );
battle_status BATTLE_CheckGameStatus( battle_event reason, int player );
void          BATTLE_SortPlayerRanks( void );
battle_status BATTLE_PlayerKilledPlayer( battle_event reason, int killer, int victim );
void          BATTLE_Shutdown( void );

#endif
